import { Reconnect } from '../Lain-plugin/apps/reconnect.js'
import plugin from '../../lib/plugins/plugin.js'

const websites = [
  'https://www.4399.com',
  'https://www.baidu.com',
  'https://www.bing.com',
  'https://www.mi.com'
]
const cron = '* * * * *'

// 新增配置项：Fetch 超时时间 (单位毫秒)
const fetchTimeout = 5000 // 默认 Fetch 超时时间设置为 5 秒

export class duanwangchongqi extends plugin {
  constructor () {
    super({
      name: '断网检测Bot重连', // 修改插件名称更贴切
      event: 'message',
      rule: [{ reg: '^#?断网检测重连', fnc: 'NetTest' }] // 修改触发指令
    })

    this.task = {
      name: '断网检测Bot重连', // 修改任务名称
      cron,
      fnc: () => {
        this.NetTest().then(r => logger.mark('掉线检测Bot重连')) // 修改日志信息
      }
    }
  }

  async NetTest () {
    let timeoutCount = 0

    const fetchWebsiteStatus = (website, timeout) => { // 新的 fetchWebsiteStatus 函数
      return new Promise(async (resolve, reject) => {
        const startTime = Date.now()
        let controller = new AbortController() // 用于控制超时
        const timer = setTimeout(() => {
          controller.abort() // 超时后取消 fetch 请求
          reject(new Error(`Fetch 请求超时 (${timeout}ms)`))
        }, timeout)

        try {
          const response = await fetch(website, {
            signal: controller.signal, // 关联 AbortController
            mode: 'no-cors' //  使用 no-cors 模式，避免 CORS 问题，只关注是否能连通
          })
          clearTimeout(timer) // 清除超时定时器
          const endTime = Date.now()
          const latency = endTime - startTime

          if (response.ok) { // response.ok 表示状态码为 2xx (成功)
            console.log(`${website}: Online (HTTP ${response.status} 响应, 延迟: ${latency}ms)`)
            resolve({ alive: true, latency, status: response.status })
          } else {
            console.log(`${website}: Offline (HTTP ${response.status} 错误, 延迟: ${latency}ms)`)
            resolve({ alive: false, latency, status: response.status })
          }
        } catch (error) {
          clearTimeout(timer) // 清除超时定时器
          console.error(`Error fetching ${website}: ${error.message}`)
          reject(error)
        }
      })
    }

    for (const website of websites) {
      try {
      // 调用新的 fetchWebsiteStatus 函数，并传入 fetchTimeout 配置
        const result = await fetchWebsiteStatus(website, fetchTimeout)
        if (!result.alive) {
          timeoutCount++
        }
      } catch (error) {
        timeoutCount++
      }
      await new Promise(resolve => setTimeout(resolve, 1000)) // 保持网站之间的 1 秒延迟
    }

    if (timeoutCount >= 2) {
      console.log('Two or more websites timed out (HTTP Fetch检测). 尝试重连 Bot...') // 更新日志信息
      // 喵的重启
      setTimeout(() => this.restart(), 2000) // 仍然调用 restart 方法，但 restart 方法内部调用 Reconnect.reconnect()
    }
  }

  // 修改 restart 方法，直接调用 Reconnect 类的 reconnect 方法
  async restart () {
    console.log('执行 restart 方法... 尝试调用 Reconnect.reconnect()') // 更新日志信息
    // 使用 Reconnect 类进行 Bot 重连
    try {
      const reconnectInstance = new Reconnect(this.e) // 创建 Reconnect 类的实例，并传递 this.e
      await reconnectInstance.reconnect() // 调用 Reconnect 实例的 reconnect() 方法，注意方法名是 reconnect
      console.log('Successfully called Reconnect.reconnect() from duanwangchongqi.restart().') // 添加成功日志
    } catch (error) {
      console.error(`Error calling Reconnect.reconnect() from duanwangchongqi.restart(): ${error}`) // 添加错误日志
    }
  }
}
